package moviescraper.doctord.view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import moviescraper.doctord.controller.amalgamation.ScrapeAmalgamatedMovieWorker.ScrapeAmalgamatedMovieWorkerProperty;
import moviescraper.doctord.controller.siteparsingprofile.SiteParsingProfile;
import moviescraper.doctord.model.Movie;
import moviescraper.doctord.model.dataitem.DataItemSource;

/**
 * Shows progress of an individual scraper during an amalgamated scrape and has
 * controls to cancel the scrape
 */
public class ScraperProgressView extends JPanel {

	private static final long serialVersionUID = 1L;

	private JLabel scraperNameLabel;

	private JLabel scrapedMovieTitle;

	private JButton progressButton;

	private DataItemSource scraper;

	private ScraperProgressPropertyChangeListener listener;

	private ScrapeAmalgamatedProgressDialog parentDialog;

	public ScraperProgressView(DataItemSource scraper, ScrapeAmalgamatedProgressDialog parentDialog) {
		//set up compenents
		this.scraper = scraper;
		listener = new ScraperProgressPropertyChangeListener();
		scraperNameLabel = new JLabel(scraper.getDataItemSourceName());
		setScraperLabel(scraperNameLabel);
		scrapedMovieTitle = new JLabel();
		progressButton = createCancelButton();
		this.parentDialog = parentDialog;
		//lay them out
		add(scraperNameLabel);
		add(scrapedMovieTitle);
		add(progressButton);
	}

	private void setScraperLabel(JLabel label) {
		Icon scraperLabelIcon;
		if (scraper instanceof SiteParsingProfile) {
			scraperLabelIcon = ((SiteParsingProfile) scraper).getProfileIcon();
			if (scraperLabelIcon != null && label != null)
				label.setIcon(scraperLabelIcon);
		}

	}

	public ScraperProgressPropertyChangeListener getScraperProgressPropertyChangeListener() {
		return listener;
	}

	private JButton createCancelButton() {
		JButton cancelButton = new JButton("Stop");
		cancelButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Trying to cancel scraping of " + scraper.getDataItemSourceName());
				if (parentDialog != null) {
					if (scraper instanceof SiteParsingProfile) {
						System.out.println("Calling cancel method in parent dialog for " + scraper);
						parentDialog.cancelRunningScraper((SiteParsingProfile) scraper);
					}
				}

			}
		});
		return cancelButton;
	}

	private class ScraperProgressPropertyChangeListener implements PropertyChangeListener {

		@Override
		public void propertyChange(PropertyChangeEvent evt) {
			//String propertyName = evt.getPropertyName();
			//System.out.println("ScraperProgressPropertyChangeListener: property changed with name = " + propertyName + " and oldValue =  " + evt.getOldValue() + " and newValue = " + evt.getNewValue());
			if (evt.getPropertyName().equals(ScrapeAmalgamatedMovieWorkerProperty.SCRAPED_MOVIE.toString())) {
				@SuppressWarnings("unchecked")
				List<Map<SiteParsingProfile, Movie>> newValue = (List<Map<SiteParsingProfile, Movie>>) evt.getNewValue();
				//if our view is the same type as one of the incoming scrapers, we can update our view with the status of the scraper
				for (Map<SiteParsingProfile, Movie> currentMap : newValue) {
					Set<SiteParsingProfile> keySet = currentMap.keySet();
					for (SiteParsingProfile currentSiteParsingProfile : keySet) {
						if (currentSiteParsingProfile.getDataItemSourceName().equals(scraper.getDataItemSourceName())) {
							List<Movie> movieScrapedList = new ArrayList<>(currentMap.values());
							Movie movieScraped = null;
							if (movieScrapedList.size() > 0)
								movieScraped = movieScrapedList.get(0);
							ScraperProgressView.this.updateProgressViewWithScrapeFinished(movieScraped);
						}
					}
				}
			}
		}

	}

	public void updateProgressViewWithScrapeFinished(Movie movieThatScraped) {
		progressButton.setText("Done");
		progressButton.setEnabled(false);
		/*
		 * if (movieThatScraped != null && movieThatScraped.hasValidTitle()) {
		 * //Commented this out because it is causing text not to fit
		 * //I will revist this in a later release because while nice to have it is not mandatory to see the movie name that has been scraped
		 * //scrapedMovieTitle.setText(movieThatScraped.getTitle().getTitle());
		 * }
		 */

	}

	public void resetPanelForNextScrape() {
		progressButton.setText("Stop");
		progressButton.setEnabled(true);

	}

}
